X86和ARM,MIPS架构

x86架构采用CISC,代表公司Intel。而ARM采用RISC,代表公司ARM。MIPS架构多用在网关、猫、机顶盒等设备。

X86以增加处理器本身复杂度作为代价,去换取更高的性能,但集成的指令集数量越来越多,给硬件带来的负荷也就越来越大,无形中增加了功耗和设计难度。x86为此还必须有复杂的分支预测机构,确保流水线的效率。再加上多级cache,支持超线程、虚拟化等等,x86的复杂度其实相当高
ARM(Advanced RISC Machines)一个32位元精简指令集(RISC)处理器架构
可以说在性能和生产工艺方面ARM根本不是X86结构系统的对手。
但ARM的优势不在于性能强大而在于效率,ARM采用RISC流水线指令集,在完成综合性工作方面根本就处于劣势,而在一些任务相对固定的应用场合其优势就能发挥得淋漓尽致。

扩展性
X86结构的电脑采用“桥”的方式与扩展设备(如:硬盘、内存等)进行连接,
x86结构的电脑能很容易进行性能扩展,如增加内存、硬盘等。
ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM的存储、内存等性能扩展难以进行

功耗
X86电脑因考虑要适应各种应用的需求,其发展思路是:性能+速度,考虑其完成复杂操作的能力,功耗很大。
ARM则功耗很低。
ARM阵营努力增加其性能和系统(特别是操作系统)的通用性,蚕食x86系统的部分终端应用市场,ARM目前是移动处理器的老大;X86阵营努力降低功耗保住其市场,同时侵入手持移动终端市场。 x86是PC端老大

NDK

Native Development Kit(NDK)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java一起打包成apk。NDK就是帮助我们可以在Android应用中使用C/C++来完成特定功能的一套工具.NDK的作用有很多,我们简单的列举两个:
1.首先NDK可以帮助开发者“快速”开发C(或C++)的动态库。
2.其次,NDK集成了“交叉编译器”。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

JNI

Java Native Interface(JNI)标准是java平台的一部分,JNI是Java语言提供的Java和C/C++相互沟通的机制,其实JNI它就是一种协议,Java可以通过JNI调用C/C++代码,C/C++的代码也可以调用java代码。

交叉编译

编译器在将中间代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU、操作系统的类型来转换。
交叉编译就是在一个平台下(比如:CPU架构为X86,操作系统为Windows)编译出在另一个平台上(比如:CPU架构为arm,操作系统为Linux)可以执行的二进制代码。Google提供的NDK就可以完成交叉编译的工作。【Android:基于Linux 内核arm架构的操作系统,装在arm上的linux是需要重新编译内核的 所以和x86上的linux内核是不一样的】

Android 设备的CPU类型(通常称为”ABIs”)

  1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的部分Android设备都使用它.
  2. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
  3. armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
  4. x86: 平板、模拟器用得比较多。
  5. x86_64: 64位的平板。

arm64-v8a是可以向下兼容的,但前提是你的项目里面没有arm64-v8a的文件夹,如果你有两个文件夹armeabi和arm64-v8a,两个文件夹,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b的时候发现有arm64-v8a的文件夹,发现里面没有b.so,就报错了,所以这个时候删掉arm64-v8a文件夹,这个时候手机发现没有适配arm64-v8a,就会直接去找armeabi的so库,所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有。

对策

  • 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中.so数量一致
  • 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹

应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。

当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支持armeabi-v7a和armeabi)。
我们往往很容易对.so文件应该放在或者生成到哪里感到困惑,下面是一个总结:Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定)